package com.coderman.system.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

/**
 * @author zhangyukang
 */
public abstract class AspectSupport {

	Method resolveMethod(ProceedingJoinPoint point) {
		MethodSignature signature = (MethodSignature) point.getSignature();
		Class<?> targetClass = point.getTarget().getClass();

		Method method = getDeclaredMethod(targetClass, signature.getName(), signature.getMethod().getParameterTypes());
		if (method == null) {
			throw new IllegalStateException("无法解析目标方法: " + signature.getMethod().getName());
		}
		return method;
	}

	private Method getDeclaredMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
		try {
			return clazz.getDeclaredMethod(name, parameterTypes);
		}
		catch (NoSuchMethodException e) {
			Class<?> superClass = clazz.getSuperclass();
			if (superClass != null) {
				return getDeclaredMethod(superClass, name, parameterTypes);
			}
		}
		return null;
	}

}
